package com.itheima.deadlock_demo;

/*
    死锁 :
        死锁是一种少见的，而且难于调试的错误\
        在两个线程对两个同步锁对象具有循环依赖时，就会大概率的出现死锁。
        我们要避免死锁的产生。否则一旦死锁，除了重启没有其他办法的

        锁对象嵌套使用!!!

        必须方案 : 避免同步嵌套!
 */
public class DeadLockDemo {
    public static void main(String[] args) {
        String 筷子左 = "筷子左";
        String 筷子右 = "筷子右";

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    synchronized (筷子左) {
                        System.out.println("女同学获得了筷子左,等待筷子右...");
                        synchronized (筷子右) {
                            System.out.println("女同学获得了筷子左和筷子右,开吃!");
                        }// 释放筷子右
                    }// 释放筷子左
                }
            }
        }, "女同学").start();


        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    synchronized (筷子右) {
                        System.out.println("男同学获得了筷子右,等待筷子左...");
                        synchronized (筷子左) {
                            System.out.println("男同学获得了筷子左和筷子右,开吃!");
                        }//释放筷子左
                    }// 释放筷子右
                }
            }
        }, "男同学").start();
    }
}
